        //副作用函数栈，存放所有副作用函数
        const e_stack = new Map();     // [name: Set(fn1,fn2), age: Set(fn1,fn2...)]
        //正在执行的副作用函数
        let activeEffect = null;
        //判断是否是对象
        function isObject(value){
            return typeof value === 'object' && value !== null
        }
         
      
        //收集依赖
        function track(target,key){
          if(!activeEffect) return
          let depSet = e_stack.get(key)   //有bug，如果是不同函数，同个属性
          if(!depSet){
              depSet = new Set()
              e_stack.set(key, depSet)
          }
          depSet.add(activeEffect)
        }
        
         //触发依赖
         function trigger(target,key){
             let depSet = e_stack.get(key)
             if(depSet)  depSet.forEach( fn=> fn())
         }
       
        /**
         * 创建响应式数据
         * @param [object]: 普通对象
         * @return [Proxy]: 代理对象
         */
        function reactive(obj){
          if(!isObject(obj)) return;
          
          return new Proxy(obj,{
            get(target,key){
              track(target,key)    //收集
              return target[key]
            },
            set(target,key,value){
              target[key] = value;
              trigger(target,key)  //触发依赖中的副作用函数
              return true;
            }
          })
        }
       
       /**
        * 注册副作用函数
        * @param [function]: 需要注册的副作用函数
        */
       function effect(fn){
         if(typeof fn !== 'function') return
         activeEffect = fn    //记录正在执行的副作用函数
         fn()                 //调用副作用函数         
         activeEffect = null  //重置全局变量
       }